/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wasolicitudesfiec.logicacontrol.SolicitarAyudantes;

import web.util.Constantes;
import entidad.Usuario;
import entidad.ayudantias.Solicitudayudantia;
import entidad.ayudantias.Solicitudserayudante;
import entidad.ayudantias.TipoAyudantia;
import entidad.ayudantias.TipoAyudantia.TipoAyudantiaEnum;
import hero.interfaces.BnNodeValue;
import hero.util.HeroException;
import java.rmi.RemoteException;
import java.sql.Date;
import java.util.ArrayList;
import javax.ejb.CreateException;
import javax.faces.context.FacesContext;
import javax.naming.NamingException;
import wasolicitudesfiec.Ayudantias.SolicitarAyudantes.RevisarInformeSeleccion;
import wasolicitudesfiec.SessionBean1;
import wasolicitudesfiec.authentication.AuthenticationPhaseListener;
import wasolicitudesfiec.general.MensajeException;
import wasolicitudesfiec.logicacontrol.*;
import wasolicitudesfiec.registros.Rg_CandidatoAyudante;

/**
 *
 * @author kabad
 */
public class CTRL_ContratacionAyudantes extends CTRL_Base {

    private RevisarInformeSeleccion gui;
    private String nombreActividad = Constantes.SolicitarAyudantes.revisarInformeSeleccion;

    public CTRL_ContratacionAyudantes(RevisarInformeSeleccion gui, FacesContext facesContext) {
        super(facesContext);
        this.gui = gui;

        String instancia;
        instancia = (String) externalContext.getRequestParameterMap().get("instancia");
        if (instancia != null) {
            externalContext.getSessionMap().put("instancia", instancia);
        }
    }

    public void inicializar() throws MensajeException {
        ArrayList<Rg_CandidatoAyudante> listaRg_CandidatoAyudante = new ArrayList<Rg_CandidatoAyudante>();
        String nombreInstanciaProf;
        Solicitudayudantia solicitudAyudantia;
        TipoAyudantia tipoAyudantia;

        try {
            nombreInstanciaProf = this.getNombreInstanciaProceso();
            this.inicializarInstancia(nombreInstanciaProf);
            int idSolicitud = Integer.parseInt((String) prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
            solicitudAyudantia = logica.getLogAyudantia().leerSolicitudayudantiaNivel3(idSolicitud);
            gui.getMenu().setTitulo(Constantes.Modelo.modelo_SolicitarAyudantes + "_" + idSolicitud + ": " + nombreActividad);

            tipoAyudantia = logica.leerTipoAyudantia(solicitudAyudantia);
            // obtener nombre y tipo de ayudnatia
            String nombreAyudantia = "";
            gui.getLabel3().setText(tipoAyudantia.getNombre());
            if (tipoAyudantia.getTipo() == TipoAyudantiaEnum.ACADEMICA) {
                nombreAyudantia = solicitudAyudantia.getMateria().getNombre();
                gui.getLabel1().setText(nombreAyudantia);
            } else {
                nombreAyudantia = solicitudAyudantia.getAyudantiavaria().getNombre();
                gui.getLabel1().setText(nombreAyudantia);
            }
            Rg_CandidatoAyudante rg_CandidatoAyudante;

            for (Solicitudserayudante object : solicitudAyudantia.getListaSolicitudserayudante()) {
                if ((object.getRespuestaConfirmacion() != null) && (object.getRespuestaConfirmacion().equals(Constantes.Atributo.DecisionConfirmacion.Aceptar.toString()))) {
                    rg_CandidatoAyudante = new Rg_CandidatoAyudante();
                    rg_CandidatoAyudante.setSolicitudserayudante(object);
                    rg_CandidatoAyudante.setSeleccionado(object.getSeleccionado());
                    rg_CandidatoAyudante.setNombreInstancia(solicitudAyudantia.getNombreinstanciaproceso());

                    listaRg_CandidatoAyudante.add(rg_CandidatoAyudante);
                }
            }
            gui.getDp_AyudantesContratados().setListaRg_CandidatoAyudante(listaRg_CandidatoAyudante);
        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
            throw new MensajeException(Constantes.Mensajes.noInicia);
        }

    }

    public void contratar() throws MensajeException {
        String nombreInstanciaProceso;
        BnNodeValue actividad;
        Solicitudayudantia solicitudAyudantia;

        Solicitudayudantia solicitud;
        Solicitudayudantia solicitud2;
        try {
            nombreInstanciaProceso = getNombreInstanciaProceso();
            this.inicializarInstancia(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);
            if (!(actividad != null && (actividad.getState() == hero.interfaces.Constants.Nd.READY || actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }

            int idSolicitud = Integer.parseInt(prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
            solicitud = logica.getLogAyudantia().leerSolicitudayudantiaNivel3(idSolicitud);
             int idDecano = new Integer(logica.leerPersonaPorUsuario(usuario.getUsuario()).getIdPersona());
            solicitud.setFkiddecano(idDecano);

            solicitud2 = logica.getLogAyudantia().guardarYClonarSolicitudAyudantia(solicitud);
            prjSession.setNodeProperty(nombreActividad, Constantes.Atributo.idSolicitudActividad, solicitud2.getIdSolicitudAyudantia() + "");
            usrSession.startActivity(nombreInstanciaProceso, nombreActividad);
            usrSession.terminateActivity(nombreInstanciaProceso, nombreActividad);

            terminarProcesosEstudiantes(solicitud, solicitud2.getIdSolicitudAyudantia());
        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
            throw new MensajeException(Constantes.Mensajes.noInicia);
        }

    }

    private void terminarProcesosEstudiantes(Solicitudayudantia solicitudayudantia, int idSolicitudActividad) throws MensajeException, NamingException, CreateException, RemoteException, RemoteException, HeroException, HeroException, Exception {
        Usuario usuarioConectado;
        SessionBean1 sessionBean1 = (SessionBean1) externalContext.getSessionMap().get("SessionBean1");
        usuarioConectado = (Usuario) externalContext.getSessionMap().get(AuthenticationPhaseListener.USER_SESSION_KEY);
        logica.autenticaComodin();
        logica.getLogAyudantia().terminarProcesosSolicitarSerAyudante(solicitudayudantia, idSolicitudActividad);
        logica.autentica(usuarioConectado.getUsuario(), usuarioConectado.getPassword());
    }

    public String getNombreInstanciaProceso() {
        String instancia;
        instancia = (String) externalContext.getSessionMap().get("instancia");
        return instancia;
    }
}
